package mensagens;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.net.Socket;

import cliente.HotelManager;

import o2b.IStream;
import o2b.MarshallableException;
import o2b.Stream;

public class EnviaDados {
	public static Mensagem enviarMensagem(Mensagem msgSaida) {
		Mensagem msgEntrada = new Mensagem();
		InputStream is = null;
		OutputStream os = null;
		Socket socket = null;
		int aux;
		
		try {
			// Cria um novo socket
			socket = new Socket(HotelManager.server, HotelManager.port);

			try {
				// Pega a entrada e saída do socket
				os = socket.getOutputStream();
				is = socket.getInputStream();
			} catch (IOException io1){
				io1.printStackTrace();
			}

			// Cria uma entrada e saída do O2B
			IStream streamSaida = new Stream();
			IStream streamEntrada = new Stream();
			
			msgSaida.marshal(streamSaida);

			
			
			try {
				
				DataOutputStream dos = new DataOutputStream(os);
				Integer size = streamSaida.size();
				String msgsize = size.toString();
				msgsize = msgsize.concat("\r\n");
				dos.writeBytes(msgsize);
				
				os.write(streamSaida.getBytes());
			} catch (IOException io2) {
				io2.printStackTrace();
			}
			
			ByteArrayOutputStream bytesCliente = new ByteArrayOutputStream();
			
			try {
				/*
				BufferedReader br = new BufferedReader(new InputStreamReader(is));
				String resp = br.readLine();
				// System.out.println("Recebi: "+resp);
				Integer k = Integer.parseInt(resp);
				
				int count = 0;
				while(count < k){
					aux = br.read();
					// System.out.println("Lendo dados enviados pelo cliente");
					bytesCliente.write(aux);
					count++;
				}
				*/
				while ((aux = is.read()) != -1) {
					bytesCliente.write(aux);
				}
			} catch (IOException ioexp1) {
				ioexp1.printStackTrace();
			}

			byte[] dadosCliente = bytesCliente.toByteArray();
			
			streamEntrada.fill(dadosCliente);
			msgEntrada.unmarshal(streamEntrada);
			switch (msgEntrada.getTipo()) {
				case TipoMensagem.MANTERSERVICO:
					ManterServico bs = new ManterServico();
					bs.unmarshal(streamEntrada);
					return bs;
					
				case TipoMensagem.MANTERRESERVA:
					ManterReserva mr = new ManterReserva();
					mr.unmarshal(streamEntrada);
					return mr;
					
				case TipoMensagem.MANTERHOSPEDE:
					ManterHospede mh = new ManterHospede();
					mh.unmarshal(streamEntrada);
					return mh;
					
				case TipoMensagem.MANTERTIPOAPARTAMENTO:
					ManterTipoApartamento mta = new ManterTipoApartamento();
					mta.unmarshal(streamEntrada);
					return mta;
					
				case TipoMensagem.MANTERITEMCONTA:
					ManterItemConta mic = new ManterItemConta();
					mic.unmarshal(streamEntrada);
					return mic;
					
				case TipoMensagem.MANTERCONTA:
					ManterConta mc = new ManterConta();
					mc.unmarshal(streamEntrada);
					return mc;
					
				default:
					break;
				// return msgEntrada;
			}

		} catch (IOException iex) {
			iex.printStackTrace();
			return null;
		} catch (MarshallableException me) {
			me.printStackTrace();
			return null;
		} finally {
			try {
				os.close();
				is.close();
				socket.close();
			} catch (IOException e) {
			}
			
		}
		
		return msgEntrada;
	}
}
